const Koa = require('koa')
const json = require('koa-json')
const onerror = require('koa-onerror')
const logger = require('koa-logger')
const checkToken = require('./src/utils/checkToken')
const staticResource = require('koa-static')
const indexRouter = require('./indexRouter')
const {koaBody} = require('koa-body');
const log4js = require('./src/utils/log4j')
const StatisticalTableDataTimer = require('./src/timer/StatisticalTableDataTimer')
// koa-onerror 错误信息
// koa-bodyparser 解析body中中的json请求数据
// koa-logger 日志
// koa-cors 跨域
// koa-static 静态资源
// koa-router 路由

// console.log(global)
const app = new Koa()


app.use(async (ctx, next) => {
    if (ctx.method === 'GET') {
        ctx.url = decodeURIComponent(ctx.url)
    }
    await next()
})

//挂载log4js
app.use(async (ctx, next) => {
    ctx.log4js = log4js
    await next()
})

//swagger文档注册
// app.use(swagger.routes()).use(swagger.allowedMethods())
// app.use(koaSwagger({
//     routePrefix: '/swagger', // host at /swagger instead of default /docs
//     swaggerOptions: {
//         url: '/swagger.json', // example path to json 其实就是之后swagger-jsdoc生成的文档地址
//     },
// }))

// error handler
onerror(app)

// middlewares
// app.use(bodyParser({
//     enableTypes: ['json', 'form', 'text'],
//     jsonLimit: '10mb',
//     multipart: true
// }))

app.use(
    koaBody({
        multipart: true,//解析多个文件
        json: true,
        jsonLimit: '5mb',
        formidable: {
            maxFileSize: 10 * 1024 * 1024 * 10,    // 设置上传文件大小最大限制，默认100M
            //uploadDir: 可以填写一个路径，不填写默认为 os.tmpDir()
        }
    })
)


app.use(json())
app.use(logger())


//静态资源暴露
app.use(staticResource(__dirname + '/src/public'))


// 日志输出
app.use(async (ctx, next) => {
    const start = new Date()
    await next()
    const ms = new Date() - start
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})

//注册鉴权限中间件
app.use(checkToken)

//注册根路由
app.use(indexRouter.routes()).use(indexRouter.allowedMethods())

//开启定时器
StatisticalTableDataTimer.AddData()

// 错误集中处理
app.on('error', (errMessage, ctx) => {
    ctx.log4js.error('路径:' + ctx.url + '/参数:' + JSON.stringify(ctx.request.body) + '/信息:' + errMessage)
    ctx.status = 500
    ctx.header = 200
    ctx.body = {
        code: 999,
        message: errMessage
    }
});


module.exports = app
